home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / graphics / 3dview12.zip / VESAASM.ASM < prev    next >
Assembly Source File  |  1996-05-30  |  39KB  |  1,864 lines

  1. .data
  2.  
  3. ; ##### VESAOffs is a table of Lineoffset values.
  4. ; ##### For example VESAOffs[100] is the Offset of Screenline 100.
  5. ; ##### With VESAOffs there are much less IMULs.
  6.  
  7. EXTRN _VESA_OFSTable:DWORD
  8. EXTRN _VESA_MinX:DWORD
  9. EXTRN _VESA_MaxX:DWORD
  10. EXTRN _VESA_MinY:DWORD
  11. EXTRN _VESA_MaxY:DWORD
  12. EXTRN _VESA_BpL:DWORD
  13. EXTRN _VESA_ScreenSize_Byte:DWORD
  14. EXTRN _VESA_Selector:WORD
  15.  
  16. VESAOffs EQU _VESA_OFSTable
  17. VESAMinX EQU _VESA_MinX
  18. VESAMinY EQU _VESA_MinY
  19. VESAMaxX EQU _VESA_MaxX
  20. VESAMaxY EQU _VESA_MaxY
  21. VESABpL  EQU _VESA_BpL
  22. VESAScrSize EQU _VESA_ScreenSize_Byte
  23. VESASel EQU _VESA_Selector
  24.  
  25. CODE SEGMENT PUBLIC DWORD USE32
  26.  
  27. ASSUME CS:CODE,FS:CODE
  28.  
  29. PUBLIC VESA_Line8B
  30. PUBLIC VESA_HLine8B
  31. PUBLIC VESA_HLineG8B
  32. PUBLIC VESA_HLineG8BFast
  33. PUBLIC VESA_HLineTex8B
  34. PUBLIC VESA_HLineTex8BFast
  35. PUBLIC VESA_HLineZ8B
  36. PUBLIC VESA_HLineGZ8B
  37. PUBLIC VESA_HLineTexZ8B
  38. PUBLIC VESA_FilledTriangle8B
  39. PUBLIC VESA_FilledTriangleG8B
  40. PUBLIC VESA_SetColor8B
  41. PUBLIC VESA_GetCodeAlias
  42. PUBLIC VESA_CopyScreen8B
  43. PUBLIC VESA_ClearScreen8B
  44. PUBLIC VESA_SetClipArea
  45. PUBLIC VESA_SyncDisplay
  46. PUBLIC VESA_SetDisplayStart
  47. PUBLIC VESA_ClearZBuffer
  48.  
  49. ; ###### Assume FS=CODE for Selfmodification.
  50. ; ###### Without this you get Compiler-Warnings.
  51. ASSUME FS:CODE
  52.  
  53. CodeAlias DW ?
  54.  
  55. VESA_SetDisplayStart PROC PASCAL X:WORD,Y:WORD
  56.  
  57.     ; ##### After calling this PROC the Graphic Adapter starts 
  58.     ; ##### scanning the Video-Memory from Row Y and Column X.
  59.  
  60.     MOV AX,04f07h
  61.     MOV BL,80h
  62.     MOV BH,0
  63.     MOV CX,X
  64.     MOV DX,Y
  65.     INT 10h
  66.     RET
  67.  
  68. VESA_SetDisplayStart ENDP
  69.  
  70. VESA_SyncDisplay PROC PASCAL
  71.  
  72.     ; ##### Waits for Vertical Retrace
  73.     ; ##### Maybe needed for 'no-flicker'.
  74.  
  75.     MOV DX,03DAh
  76.     
  77.   sd_Wait0:
  78.   
  79.     IN AL,DX
  80.     TEST AL,08h
  81.     JNZ sd_Wait0
  82.     
  83.   sd_Wait1:
  84.   
  85.     IN AL,DX
  86.     TEST AL,08h
  87.     JZ sd_Wait1
  88.     
  89.     RET
  90.  
  91. VESA_SyncDisplay ENDP
  92.  
  93. VESA_SetClipArea PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD
  94.  
  95.     ; ##### Changes the VESAMin- and VESAMax-Values.
  96.     ; ##### Fast routines can plug these Values directly
  97.     ; ##### in their code. This is much faster then
  98.     ; ##### CMPring to memory values. 
  99.   
  100.     ; ##### CodeAlias needed for Code Segment
  101.     ; ##### writes.
  102.     MOV FS,CS:CodeAlias
  103.  
  104.     MOV EAX,X1
  105.     MOV VESAMinX,EAX
  106.     MOV FS:Li8B_XCMPMinX,EAX
  107.     MOV FS:Li8B_YCMPMinX,EAX
  108.     MOV FS:HLi8BR_X2CMPMinX,EAX    
  109.     MOV FS:HLi8BR_X1CMPMinX,EAX
  110.     MOV FS:HLi8BR_MOVMinX,EAX
  111.     MOV FS:HLiG8B_CMPMinX,EAX
  112.     MOV FS:HLiG8B_CMPMinX2,EAX
  113.     MOV FS:HLiG8B_SUBMinX,EAX
  114.     MOV FS:HLiG8B_MOVMinX,EAX
  115.     
  116.     MOV EAX,Y1
  117.     MOV VESAMinY,EAX
  118.     MOV FS:Li8B_XCMPMinY,EAX
  119.     MOV FS:Li8B_YCMPMinY,EAX
  120.     MOV FS:HLi8BR_CMPMinY,EAX
  121.     MOV FS:HLiG8B_CMPMinY,EAX
  122.     
  123.     MOV EAX,X2
  124.     MOV VESAMaxX,EAX
  125.     MOV FS:Li8B_XCMPMaxX,EAX
  126.     MOV FS:Li8B_YCMPMaxX,EAX
  127.     MOV FS:HLi8BR_X2CMPMaxX,EAX    
  128.     MOV FS:HLi8BR_X1CMPMaxX,EAX
  129.     MOV FS:HLi8BR_MOVMaxX,EAX
  130.     MOV FS:HLiG8B_CMPMaxX,EAX
  131.     MOV FS:HLiG8B_CMPMaxX2,EAX
  132.     MOV FS:HLiG8B_MOVMaxX,EAX
  133.     
  134.     MOV EAX,Y2
  135.     MOV VESAMaxY,EAX
  136.     MOV FS:Li8B_XCMPMaxY,EAX
  137.     MOV FS:Li8B_YCMPMaxY,EAX
  138.     MOV FS:HLi8BR_CMPMaxY,EAX
  139.     MOV FS:HLiG8B_CMPMaxY,EAX
  140.     
  141.     RET
  142.     
  143. VESA_SetClipArea ENDP
  144.  
  145. VESA_SetColor8B PROC PASCAL NR:WORD,R:WORD,G:WORD,B:WORD
  146.  
  147.     ; ##### Sets the Palette Entry for Color NR.
  148.     ; ##### Red,Green and Blue Values from 0 to 255.
  149.  
  150.     MOV BL,BYTE PTR NR
  151.     MOV BH,0
  152.     MOV DH,BYTE PTR R
  153.     SHR DH,2
  154.     MOV CH,BYTE PTR G
  155.     SHR CH,2
  156.     MOV CL,BYTE PTR B
  157.     SHR CL,2
  158.     MOV AX,1010h
  159.     INT 10h
  160.     RET
  161.  
  162. VESA_SetColor8B ENDP
  163.  
  164. VESA_ClearScreen8B PROC PASCAL CO:DWORD,S:WORD
  165.  
  166.     ; ##### Clears the Screen 'S' in all 256-Color-Modes.
  167.     ; ##### Fills the Screen with Color CO.
  168.     ; ##### Uses fast DWORD STOS.
  169.     ; ##### The number of bytes cleared are taken from
  170.     ; ##### VESAScrSize=VESABpL*YResolution of the
  171.     ; ##### current Video Mode.
  172.     
  173.     MOV ECX,VESAScrSize
  174.     MOV EBX,ECX
  175.     AND EBX,11b
  176.     SHR ECX,2
  177.     MOV ES,S
  178.     XOR EDI,EDI
  179.     MOV EAX,CO
  180.     CLD
  181.     REP STOS DWORD ES:[EDI]
  182.     MOV ECX,EBX
  183.     REP STOS BYTE ES:[EDI]
  184.     
  185.     RET
  186.     
  187. VESA_ClearScreen8B ENDP
  188.  
  189. VESA_CopyScreen8B PROC PASCAL S:WORD,D:WORD
  190.  
  191.     ; ##### Copies the Screen 'S' to the Screen 'D' in all
  192.     ; ##### 256-Color-Modes.
  193.     ; ##### Uses fast DWORD MOVS.
  194.     ; ##### The number of bytes copied are taken from
  195.     ; ##### VESAScrSize=VESABpL*YResolution of the
  196.     ; ##### current Video Mode.
  197.     
  198.     MOV ECX,VESAScrSize
  199.     MOV EBX,ECX
  200.     AND EBX,11b
  201.     SHR ECX,2
  202.     MOV FS,S
  203.     XOR ESI,ESI
  204.     MOV ES,D
  205.     XOR EDI,EDI
  206.     CLD
  207.     REP MOVS DWORD ES:[EDI],FS:[ESI]
  208.     MOV ECX,EBX
  209.     REP MOVS BYTE ES:[EDI],FS:[ESI]
  210.   
  211.     RET
  212.     
  213. VESA_CopyScreen8B ENDP
  214.  
  215. VESA_GetCodeAlias PROC PASCAL
  216.  
  217.     ; ##### Because writing to Code Segment causes a protection fault,
  218.     ; ##### we have to create a Code Alias Selector, to which we can
  219.     ; ##### write. This is done by DPMI Function 000ah.
  220.     
  221.     MOV AX,0000ah
  222.     MOV BX,CS
  223.     INT 031h
  224.     MOV FS,AX
  225.     MOV FS:CodeAlias,AX
  226.     RET
  227.     
  228. VESA_GetCodeAlias ENDP
  229.  
  230. VESA_Line8B PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD,C:DWORD,S:WORD
  231.  
  232.     ; ##### 
  233.     ; ##### Line8B draws a Line from (X1,Y1) to (X2,Y2) in all
  234.     ; ##### 256-Color-Modes. C is used as color and S as the 
  235.     ; ##### Screenselector.
  236.     ; ##### 
  237.  
  238.     ; ##### FS = CodeAlias for Self-Modification
  239.     ; ##### GS = Selector of Screen
  240.     MOV FS,CS:CodeAlias
  241.     MOV GS,S
  242.  
  243.     ; ##### ECX  = X2-X1    
  244.     ; ##### EAX  = ABS( ECX )
  245.     ; ##### AddX = ( X2-X1 > 0 ? 1 : -1 )
  246.     MOV EAX,X2
  247.     SUB EAX,X1
  248.     MOV ECX,EAX
  249.     MOV DWORD FS:Li8B_AddX,1
  250.     JNS Li8B_DXPos
  251.     MOV DWORD FS:Li8B_AddX,-1
  252.     NEG EAX
  253.     
  254.   Li8B_DXPos: 
  255.   
  256.     ; ##### EDX  = Y2-Y1
  257.     ; ##### EBX  = ABS( EDX )
  258.     ; ##### AddY = ( Y2-Y1 > 0 ? 1 : -1 )
  259.     MOV EBX,Y2
  260.     SUB EBX,Y1
  261.     MOV EDX,EBX
  262.     MOV DWORD FS:Li8B_AddY,1
  263.     JNS Li8B_DYPos
  264.     MOV DWORD FS:Li8B_AddY,-1
  265.     NEG EBX
  266.     
  267.   Li8B_DYPos: 
  268.   
  269.     ; ##### Walk along X-Axis or Y-Axis ?
  270.     CMP EBX,EAX
  271.     JLE Li8B_ADXBigger
  272.     
  273.       ; ##### Calculate M = (X2-X1)/ABS(Y2-Y1) * 2^16
  274.       OR EBX,EBX
  275.       JZ Li8B_DYZero
  276.       MOV EAX,ECX
  277.       SHL EAX,16
  278.       CDQ
  279.       IDIV EBX   
  280.       MOV FS:Li8B_YM,EAX
  281.       
  282.     Li8B_DYZero:
  283.  
  284.       ; ##### ECX = Number of Pixs  
  285.       ; ##### EAX = Color
  286.       ; ##### EDX = X1 * 2^16
  287.       ; ##### EBX = Y1  
  288.       MOV ECX,EBX
  289.       INC ECX
  290.       MOV EAX,C 
  291.       MOV EDX,X1
  292.       SHL EDX,16
  293.       MOV EBX,Y1
  294.       
  295.     Li8B_LoopY:
  296.     
  297.       ; ##### ESI = INT( X );
  298.       MOV ESI,EDX
  299.       SAR ESI,16
  300.       
  301.       ; ##### Clipping ...
  302.       ; ##### The Clipping-Values are set by 'SetClipArea'
  303.       
  304.       ; ##### CMP ESI,YCMPMinX 
  305.       DB 081h, 0feh
  306.       Li8B_YCMPMinX DD ?               
  307.       JL Li8B_YNoPix
  308.       
  309.       ; ##### CMP ESI,YCMPMaxX
  310.       DB 081h, 0feh
  311.       Li8B_YCMPMaxX DD ?               
  312.       JG Li8B_YNoPix
  313.       
  314.       ; ##### CMP EBX,YCMPMinY
  315.       DB 081h, 0fbh
  316.       Li8B_YCMPMinY DD ?               
  317.       JL Li8B_YNoPix
  318.       
  319.       ; ##### CMP EBX,YCMPMaxY
  320.       DB 081h, 0fbh
  321.       Li8B_YCMPMaxY DD ?               
  322.       JG Li8B_YNoPix
  323.       
  324.         ; ##### ' Pix( ESI, EBX, AL ) '
  325.         ; ##### These two are the only memory references
  326.         ; ##### in the LOOP. It should be fast.
  327.         MOV EDI,VESAOffs[EBX*4]
  328.         MOV GS:[EDI+ESI],AL
  329.         
  330.     Li8B_YNoPix:  
  331.  
  332.       ; ##### Calculate new X- and Y-Values and go on... 
  333.     
  334.       ; ##### ADD EDX,M means 'ADD X,M'
  335.       DB 081h, 0c2h
  336.       Li8B_YM DD ?                     
  337.       
  338.       ; ##### ADD EBX,AddY means 'ADD Y,AddY'
  339.       DB 081h, 0c3h
  340.       Li8B_AddY DD ?                   
  341.       
  342.       LOOP Li8B_LoopY   
  343.       
  344.       RET
  345.       
  346.   Li8B_ADXBigger: 
  347.   
  348.       ; ##### ECX = Number of Pixs
  349.       MOV ECX,EAX
  350.       INC ECX   
  351.       
  352.       ; ##### Calculate M = (Y2-Y1)/ABS(X2-X1) * 2^16
  353.       OR EAX,EAX
  354.       JZ Li8B_DXZero
  355.       MOV EBX,EAX
  356.       MOV EAX,EDX
  357.       SHL EAX,16
  358.       CDQ
  359.       IDIV EBX   
  360.       MOV FS:Li8B_XM,EAX
  361.       
  362.     Li8B_DXZero:
  363.     
  364.       ; ##### EAX = Color
  365.       ; ##### ESI = X1
  366.       ; ##### EDX = Y1 * 2^16
  367.       MOV EAX,C 
  368.       MOV ESI,X1
  369.       MOV EDX,Y1
  370.       SHL EDX,16
  371.       
  372.     Li8B_LoopX:
  373.     
  374.       ; ##### EBX = INT( Y )    
  375.       MOV EBX,EDX
  376.       SAR EBX,16
  377.       
  378.       ; ##### Clipping ...
  379.       ; ##### The Clipping-Values are set by 'SetClipArea'
  380.       
  381.       ; ##### CMP ESI,XCMPMinX
  382.       DB 081h, 0feh
  383.       Li8B_XCMPMinX DD ?               
  384.       JL Li8B_XNoPix
  385.       
  386.       ; ##### CMP ESI,XCMPMaxX
  387.       DB 081h, 0feh
  388.       Li8B_XCMPMaxX DD ?               
  389.       JG Li8B_XNoPix
  390.       
  391.       ; ##### CMP EBX,XCMPMinY
  392.       DB 081h, 0fbh
  393.       Li8B_XCMPMinY DD ?               
  394.       JL Li8B_XNoPix
  395.       
  396.       ; ##### CMP EBX,XCMPMaxY
  397.       DB 081h, 0fbh
  398.       Li8B_XCMPMaxY DD ?               
  399.       JG Li8B_XNoPix
  400.       
  401.         ; ##### ' Pix( ESI, EBX, AL ) '
  402.         ; ##### These two are the only memory references
  403.         ; ##### in the LOOP. It should be fast.
  404.         MOV EDI,VESAOffs[EBX*4]
  405.         MOV GS:[EDI+ESI],AL
  406.         
  407.     Li8B_XNoPix:  
  408.     
  409.       ; ##### Calculate new X- and Y-Values and go on... 
  410.     
  411.       ; ##### ADD EDX,M means 'ADD Y,M'
  412.       DB 081h, 0c2h
  413.       Li8B_XM DD ?                     
  414.       
  415.       ; ##### ADD ESI,AddX means ADD 'X,AddX'
  416.       DB 081h, 0c6h
  417.       Li8B_AddX DD ?                   
  418.       
  419.       LOOP Li8B_LoopX   
  420.       
  421.       RET
  422.       
  423. VESA_Line8B ENDP
  424.    
  425. VESA_HLine8B PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,C:DWORD,S:WORD
  426.     
  427.     ; #####
  428.     ; ##### HLine8B draws a horizontal line from (X1,Y) to
  429.     ; ##### (X2,Y) in all 256-Color-Modes. 
  430.     ; ##### C is used as Color, S as the Screenselector.
  431.     ; #####
  432.     
  433.     ; ##### Clip before Drawing.
  434.     MOV EAX,Y
  435.     CMP EAX,VESAMinY
  436.     JL HLi8B_Exit
  437.     
  438.     CMP EAX,VESAMaxY
  439.     JG HLi8B_Exit
  440.     
  441.     MOV EBX,X1
  442.     MOV ECX,X2
  443.     CMP ECX,EBX
  444.     JGE HLi8B_XOk
  445.     XCHG EBX,ECX
  446.     
  447.   HLi8B_XOk:  
  448.   
  449.     CMP ECX,VESAMinX
  450.     JL HLi8B_Exit
  451.     
  452.     CMP EBX,VESAMaxX
  453.     JG HLi8B_Exit
  454.     
  455.     CMP EBX,VESAMinX
  456.     JGE HLi8B_X1Ok
  457.     MOV EBX,VESAMinX
  458.     
  459.   HLi8B_X1Ok:  
  460.     
  461.     CMP ECX,VESAMaxX
  462.     JLE HLi8B_X2Ok
  463.     MOV ECX,VESAMaxX
  464.     
  465.   HLi8B_X2Ok:
  466.  
  467.     ; ##### ECX = Number of Bytes  
  468.     SUB ECX,EBX
  469.     INC ECX
  470.     
  471.     ; ##### ES:[EDI] = Screenoffset
  472.     MOV ES,S
  473.     MOV EDI,VESAOffs[EAX*4]
  474.     ADD EDI,EBX
  475.     
  476.     ; ##### Put AL in all bytes of EAX for STOS DWORD's.
  477.     MOV EAX,C
  478.     MOV AH,AL
  479.     MOV BX,AX
  480.     SHL EAX,16
  481.     MOV AX,BX
  482.  
  483.     ; ##### EBX = Number of STOS BYTE's.
  484.     ; ##### ECX = Number of STOS DWORD's.
  485.     MOV EBX,ECX
  486.     SHR ECX,2
  487.     AND EBX,11b
  488.     
  489.     ; ##### Fill.
  490.     CLD
  491.     REP STOS DWORD ES:[EDI]
  492.     MOV ECX,EBX
  493.     REP STOS BYTE ES:[EDI]
  494.     
  495.   HLi8B_Exit:  
  496.   
  497.     RET
  498.     
  499. VESA_HLine8B ENDP   
  500.    
  501. VESA_HLine8BReg PROC
  502.     
  503.     ; #####
  504.     ; ##### HLine8BReg draws a horizontal line from (EBX,EDX) to
  505.     ; ##### (ECX,EDX) in all 256-Color-Modes. 
  506.     ; ##### EAX is used as Color, ES as the Screenselector.
  507.     ; ##### Clipping Values are set by SetClipArea.
  508.     ; #####
  509.     ; ##### These registers are changed :
  510.     ; ##### EBX,ECX,EDI
  511.     ; #####
  512.  
  513.     ; ##### Clip before Drawing.
  514.     
  515.     ; ##### This means 'CMP EDX,CMPMinY'
  516.     DB 081h,0fah
  517.     HLi8BR_CMPMinY DD ?
  518.     JL HLi8BR_Exit
  519.     
  520.     ; ##### This means 'CMP EDX,CMPMaxY'
  521.     DB 081h,0fah
  522.     HLi8BR_CMPMaxY DD ?
  523.     JG HLi8BR_Exit
  524.     
  525.     CMP ECX,EBX
  526.     JGE HLi8BR_XOk
  527.     XCHG EBX,ECX
  528.     
  529.   HLi8BR_XOk:  
  530.   
  531.     ; ##### This means 'CMP ECX,X2CMPMinX'
  532.     DB 081h,0f9h
  533.     HLi8BR_X2CMPMinX DD ?    
  534.     JL HLi8BR_Exit
  535.     
  536.     ; ##### This means 'CMP EBX,X1CMPMaxX'
  537.     DB 081h,0fbh
  538.     HLi8BR_X1CMPMaxX DD ?
  539.     JG HLi8BR_Exit
  540.     
  541.     ; ##### This means 'CMP EBX,X1CMPMinX'
  542.     DB 081h,0fbh
  543.     HLi8BR_X1CMPMinX DD ?
  544.     JGE HLi8BR_X1Ok
  545.     ; ##### This means 'MOV EBX,MOVMinX'
  546.     DB 0bbh
  547.     HLi8BR_MOVMinX DD ?
  548.     
  549.   HLi8BR_X1Ok:  
  550.     
  551.     ; ##### This means 'CMP ECX,X2CMPMaxX'
  552.     DB 081h,0f9h
  553.     HLi8BR_X2CMPMaxX DD ?
  554.     JLE HLi8BR_X2Ok
  555.     ; ##### This means 'MOV ECX,MOVMaxX'
  556.     DB 0b9h
  557.     HLi8BR_MOVMaxX DD ?
  558.     
  559.   HLi8BR_X2Ok:
  560.  
  561.     ; ##### ECX = Number of Bytes  
  562.     SUB ECX,EBX
  563.     INC ECX
  564.     
  565.     ; ##### ES:[EDI] = Screenoffset
  566.     MOV EDI,VESAOffs[EDX*4]
  567.     ADD EDI,EBX
  568.     
  569.     ; ##### Put AL in all bytes of EAX for STOS DWORD's.
  570.     MOV AH,AL
  571.     MOV BX,AX
  572.     SHL EAX,16
  573.     MOV AX,BX
  574.  
  575.     ; ##### EBX = Number of STOS BYTE's.
  576.     ; ##### ECX = Number of STOS DWORD's.
  577.     MOV EBX,ECX
  578.     SHR ECX,2
  579.     AND EBX,11b
  580.     
  581.     ; ##### Fill.
  582.     CLD
  583.     REP STOS DWORD ES:[EDI]
  584.     MOV ECX,EBX
  585.     REP STOS BYTE ES:[EDI]
  586.     
  587.   HLi8BR_Exit:  
  588.   
  589.     RET
  590.  
  591. VESA_HLine8BReg ENDP   
  592.    
  593. VESA_FilledTriangle8B PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD,X3:DWORD,Y3:DWORD,
  594.                                   C:DWORD,S:WORD
  595.                         
  596.     ; #####
  597.     ; ##### FilledTriangle8B draws a filled, clipped Triangle in all
  598.     ; ##### 256-Color-Modes. C is used as Color. S as the Screen-
  599.     ; ##### selector.
  600.     ; #####
  601.     
  602.     ; ##### FS = CodeAlias for Selfmodification.
  603.     MOV FS,CS:CodeAlias                        
  604.                         
  605.     ; ##### Bubblesort the Points (X1,Y1),(X2,Y2) and (X3,Y3)
  606.     ; ##### to increasing Y-Values.
  607.     MOV EAX,Y1
  608.     MOV EBX,Y2
  609.     MOV ECX,Y3
  610.     
  611.     ; ##### IF Y1 > Y2 THEN SWAP(Y1,Y2);SWAP(X1,X2)
  612.     CMP EAX,EBX
  613.     JLE FTri8B_Sort1
  614.     XCHG EAX,EBX
  615.     MOV EDX,X1
  616.     XCHG EDX,X2
  617.     MOV X1,EDX
  618.     
  619.   FTri8B_Sort1: 
  620.     
  621.     ; ##### IF Y2 > Y3 THEN SWAP(Y2,Y3);SWAP(X2,X3)
  622.     CMP EBX,ECX
  623.     JLE FTri8B_Sort2
  624.     XCHG EBX,ECX
  625.     MOV EDX,X2
  626.     XCHG EDX,X3
  627.     MOV X2,EDX
  628.     
  629.   FTri8B_Sort2: 
  630.                         
  631.     ; ##### Once again : IF Y1 > Y2 THEN SWAP(Y1,Y2);SWAP(X1,X2)
  632.     CMP EAX,EBX
  633.     JLE FTri8B_Sort3
  634.     XCHG EAX,EBX
  635.     MOV EDX,X1
  636.     XCHG EDX,X2
  637.     MOV X1,EDX
  638.     
  639.   FTri8B_Sort3: 
  640.     
  641.     MOV Y1,EAX
  642.     MOV Y2,EBX
  643.     MOV FS:FTri8B_CMPY2,EBX    
  644.     MOV Y3,ECX
  645.     MOV FS:FTri8B_CMPY3,ECX    
  646.     
  647.     ; ##### IF Y1<>Y2 THEN M12=(X2-X1)/(Y2-Y1)*2^16
  648.     SUB EBX,EAX
  649.     JZ FTri8B_CalcM13
  650.     MOV EAX,X2
  651.     SUB EAX,X1
  652.     SHL EAX,16
  653.     CDQ
  654.     IDIV EBX
  655.     MOV FS:FTri8B_M12,EAX
  656.     
  657.   FTri8B_CalcM13:
  658.   
  659.     ; ##### IF Y1<>Y3 THEN M13=(X3-X1)/(Y3-Y1)*2^16
  660.     MOV EBX,Y3
  661.     SUB EBX,Y1
  662.     JZ FTri8B_CalcM23
  663.     MOV EAX,X3
  664.     SUB EAX,X1
  665.     SHL EAX,16
  666.     CDQ
  667.     IDIV EBX
  668.     MOV FS:FTri8B_L1M13,EAX
  669.     MOV FS:FTri8B_L2M13,EAX
  670.     
  671.   FTri8B_CalcM23:
  672.   
  673.     ; ##### IF Y2<>Y3 THEN M23=(X3-X2)/(Y3-Y2)*2^16
  674.     MOV EBX,Y3
  675.     SUB EBX,Y2
  676.     JZ FTri8B_Draw
  677.     MOV EAX,X3
  678.     SUB EAX,X2
  679.     SHL EAX,16
  680.     CDQ
  681.     IDIV EBX
  682.     MOV FS:FTri8B_M23,EAX
  683.  
  684.   FTri8B_Draw:
  685.  
  686.     ; ##### Two loops follow, in wich (XA,Y) and (XB,Y) walk along the
  687.     ; ##### edges of the triangle.
  688.     ; ##### In the first, Y walks from Y1 to Y2, XA walks from X1 to X2
  689.     ; ##### and XB starts to walk from X1 to X3.
  690.     ; ##### In the second loop, Y continues to Y3, XA walks from X2 to X3
  691.     ; ##### and XB continues his journey to X3.
  692.     
  693.     ; ##### Initialize registers:
  694.     ; ##### EDX = Y-Counter.
  695.     ; ##### EAX = Color.
  696.     ; ##### EBX = XA = X1*2^16
  697.     ; ##### ECX = XB = X1*2^16
  698.     MOV EDX,Y1
  699.     MOV EAX,C
  700.     MOV ES,S
  701.     MOV EBX,X1
  702.     MOV ECX,EBX
  703.     SHL EBX,16
  704.     SHL ECX,16
  705.     MOV FTri8B_MEBP,EBP
  706.  
  707.   FTri8B_Loop1:  
  708.     
  709.     ; ##### This means 'CMP EDX,CMPY2'
  710.     DB 081h,0fah
  711.     FTri8B_CMPY2 DD ?
  712.     JE FTri8B_Loop2Init
  713.     
  714.     ; ##### Save EBX and ECX.
  715.     MOV ESI,EBX
  716.     MOV EBP,ECX
  717.     
  718.     ; ##### Parameters for HLine8BReg:
  719.     ; ##### EBX = 'XA'
  720.     ; ##### ECX = 'XB'
  721.     SAR EBX,16
  722.     SAR ECX,16
  723.     
  724.     CALL VESA_HLine8BReg
  725.     
  726.     ; ##### Restore EBX and ECX.
  727.     MOV EBX,ESI
  728.     MOV ECX,EBP
  729.     
  730.     ; ##### Calculate new X-Values.    
  731.     ; ##### This means 'ADD EBX,M12'
  732.     DB 081h, 0c3h
  733.     FTri8B_M12 DD ?
  734.  
  735.     ; ##### This means 'ADD ECX,L1M13'
  736.     DB 081h, 0c1h
  737.     FTri8B_L1M13 DD ?
  738.     
  739.     ; ##### Next Line...
  740.     INC EDX
  741.     JMP FTri8B_Loop1
  742.  
  743.   FTri8B_Loop2Init:
  744.   
  745.     MOV EBP,FTri8B_MEBP
  746.     MOV EBX,X2
  747.     SHL EBX,16
  748.   
  749.   FTri8B_Loop2:  
  750.   
  751.     ; ##### This means 'CMP EDX,CMPY3'
  752.     DB 081h,0fah
  753.     FTri8B_CMPY3 DD ?
  754.     JG FTri8B_LoopExit
  755.     
  756.     ; ##### Save EBX and ECX.
  757.     MOV ESI,EBX
  758.     MOV EBP,ECX
  759.     
  760.     ; ##### Parameters for HLine8BReg:
  761.     ; ##### EBX = XA
  762.     ; ##### ECX = XB
  763.     SAR EBX,16
  764.     SAR ECX,16
  765.     
  766.     CALL VESA_HLine8BReg
  767.     
  768.     ; ##### Restore EBX and ECX.
  769.     MOV EBX,ESI
  770.     MOV ECX,EBP
  771.     
  772.     ; ##### Calculate new X-Values.    
  773.     ; ##### This means 'ADD EBX,M23'
  774.     DB 081h, 0c3h
  775.     FTri8B_M23 DD ?
  776.  
  777.     ; ##### This means 'ADD ECX,L2M13'
  778.     DB 081h, 0c1h
  779.     FTri8B_L2M13 DD ?
  780.     
  781.     ; ##### Next Line...
  782.     INC EDX
  783.     JMP FTri8B_Loop2
  784.  
  785.   FTri8B_LoopExit:
  786.   
  787.     MOV EBP,FTri8B_MEBP
  788.     
  789.   FTri8B_Exit:  
  790.  
  791.     RET                
  792.     
  793.     FTri8B_MEBP DD ?
  794.  
  795. VESA_FilledTriangle8B ENDP   
  796.    
  797. VESA_HLineG8B PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,C1:DWORD,C2:DWORD,S:WORD
  798.     
  799.     ; #####
  800.     ; ##### HLine8B draws a gouraudshaded horizontal line from (X1,Y) to
  801.     ; ##### (X2,Y) in all 256-Color-Modes. 
  802.     ; ##### Interpolates from Color C1 to C2, S is used as the Screenselector.
  803.     ; #####
  804.     
  805.     LOCAL StartC:DWORD
  806.     
  807.     ; ##### Clip before Drawing.
  808.     MOV EAX,Y
  809.  
  810.     ; ##### This means CMP EAX,VESAMinY
  811.     DB 03dh
  812.     HLiG8B_CMPMinY DD ?
  813.     JL HLiG8B_Exit
  814.      
  815.     ; ##### This means CMP EAX,VESAMaxY
  816.     DB 03dh
  817.     HLiG8B_CMPMaxY DD ?
  818.     JG HLiG8B_Exit
  819.     
  820.     MOV EBX,X1
  821.     MOV ECX,X2
  822.     MOV ESI,C1
  823.     MOV EDX,C2
  824.     CMP ECX,EBX
  825.     JGE HLiG8B_XOk
  826.     XCHG EBX,ECX
  827.     MOV X1,EBX
  828.     MOV X2,ECX
  829.     XCHG EDX,ESI
  830.  
  831.   HLiG8B_XOk:  
  832.   
  833.     ; ##### This means CMP ECX,VESAMinX
  834.     DB 081h,0f9h
  835.     HLiG8B_CMPMinX DD ?
  836.     JL HLiG8B_Exit
  837.     
  838.     ; ##### This means CMP ECX,VESAMaxX
  839.     DB 081h,0fbh
  840.     HLiG8B_CMPMaxX DD ?
  841.     JG HLiG8B_Exit
  842.     
  843.     ; ##### Here I have to say some words. If X1 is left of
  844.     ; ##### the clip border, X1 is set to VESAMinX. This
  845.     ; ##### is simple. But the Color Value of X1 must also
  846.     ; ##### be increased. So the difference between X1 and
  847.     ; ##### VESAMinX in pixels is saved in HLiG8B_Mul.
  848.     ; ##### Later we IMUL this with DC/DX and add it to
  849.     ; ##### the starting color value. If no clipping is done,
  850.     ; ##### HLiG8B_Mul is set to zero and nothing is added.
  851.  
  852.     MOV StartC,0
  853.  
  854.     ; ##### This means CMP EBX,VESAMinX
  855.     DB 081h,0fbh
  856.     HLiG8B_CMPMinX2 DD ?
  857.     JGE HLiG8B_X1Ok
  858.     
  859.     ; ##### This means SUB EBX,VESAMinX
  860.     DB 081h,0ebh
  861.     HLiG8B_SUBMinX DD ?
  862.     
  863.     NEG EBX
  864.     MOV StartC,EBX
  865.     
  866.     ; ##### This means MOV EBX,VESAMinX
  867.     DB 0bbh
  868.     HLiG8B_MOVMinX DD ?
  869.     
  870.   HLiG8B_X1Ok:  
  871.     
  872.     ; ##### This means CMP ECX,VESAMaxX
  873.     DB 081h,0f9h
  874.     HLiG8B_CMPMaxX2 DD ?
  875.     JLE HLiG8B_X2Ok
  876.  
  877.     ; ##### This means MOV ECX,VESAMaxX
  878.     DB 0b9h
  879.     HLiG8B_MOVMaxX DD ?
  880.     
  881.   HLiG8B_X2Ok:
  882.  
  883.     ; ##### ES:[EDI] = Screenoffset
  884.     MOV ES,S
  885.     MOV EDI,VESAOffs[EAX*4]
  886.     ADD EDI,EBX
  887.     
  888.     ; ##### ECX = Number of Bytes.
  889.     ; ##### EBX = X2 - X1.
  890.     ; ##### EAX = (C2 - C1)*2^16.
  891.     SUB ECX,EBX
  892.     INC ECX
  893.  
  894.     MOV EBX,X2
  895.     SUB EBX,X1
  896.     JZ HLiG8B_InitFill
  897.     
  898.     MOV EAX,EDX
  899.     SUB EAX,ESI
  900.     CDQ
  901.     IDIV EBX
  902.     ; ##### EBX = (C2 - C1)/(X2 - X1)*2^16
  903.     MOV EBX,EAX
  904.     
  905.   HLiG8B_InitFill:  
  906.  
  907.     ; ##### In case of clipping, correct the start color. (see above)
  908.     IMUL EAX,StartC
  909.     ADD ESI,EAX
  910.     MOV EAX,ESI
  911.     CLD
  912.  
  913.     ; ##### Fill.
  914.  
  915.   HLiG8B_FillLoop:  
  916.   
  917.     ; ##### EAX = Color.
  918.     BSWAP EAX
  919.     MOV ES:[EDI],AH
  920.     INC EDI
  921.     BSWAP EAX
  922.     
  923.     ; ##### Calculate new Color.
  924.     ADD EAX,EBX
  925.     
  926.     ; ##### Go on.
  927.     LOOP HLiG8B_FillLoop
  928.     
  929.   HLiG8B_Exit:  
  930.   
  931.     RET
  932.  
  933. VESA_HLineG8B ENDP   
  934.    
  935. VESA_FilledTriangleG8B PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD,X3:DWORD,Y3:DWORD,
  936.                                    C1:DWORD,C2:DWORD,C3:DWORD,S:WORD
  937.                         
  938.     ; #####
  939.     ; ##### FilledTriangle8B draws a filled, clipped and gouraudshaded
  940.     ; ##### Triangle in all 256-Color-Modes.
  941.     ; ##### C1,C2,C3 are the Color Values of each edge. S the Screen-
  942.     ; ##### Selector.
  943.     ; #####
  944.     
  945.     LOCAL M12:DWORD,M13:DWORD,M23:DWORD
  946.     LOCAL MC12:DWORD,MC13:DWORD,MC23:DWORD
  947.     LOCAL Y:DWORD,XA:DWORD,XB:DWORD,CA:DWORD,CB:DWORD
  948.   
  949.     ; ##### FS = CodeAlias for Selfmodification.
  950.     MOV FS,CS:CodeAlias                        
  951.                         
  952.     ; ##### Bubblesort the Points (X1,Y1),(X2,Y2) and (X3,Y3)
  953.     ; ##### to increasing Y-Values.
  954.     MOV EAX,Y1
  955.     MOV EBX,Y2
  956.     MOV ECX,Y3
  957.     
  958.     ; ##### IF Y1 > Y2 THEN SWAP(Y1,Y2);SWAP(X1,X2);SWAP(C1,C2)
  959.     CMP EAX,EBX
  960.     JLE FTriG8B_Sort1
  961.     XCHG EAX,EBX
  962.     MOV EDX,X1
  963.     XCHG EDX,X2
  964.     MOV X1,EDX
  965.     MOV EDX,C1
  966.     XCHG EDX,C2
  967.     MOV C1,EDX
  968.     
  969.   FTriG8B_Sort1: 
  970.     
  971.     ; ##### IF Y2 > Y3 THEN SWAP(Y2,Y3);SWAP(X2,X3);SWAP(C2,C3)
  972.     CMP EBX,ECX
  973.     JLE FTriG8B_Sort2
  974.     XCHG EBX,ECX
  975.     MOV EDX,X2
  976.     XCHG EDX,X3
  977.     MOV X2,EDX
  978.     MOV EDX,C2
  979.     XCHG EDX,C3
  980.     MOV C2,EDX
  981.     
  982.   FTriG8B_Sort2: 
  983.                         
  984.     ; ##### Once again : IF Y1 > Y2 THEN SWAP(Y1,Y2);SWAP(X1,X2);SWAP(C1,C2)
  985.     CMP EAX,EBX
  986.     JLE FTriG8B_Sort3
  987.     XCHG EAX,EBX
  988.     MOV EDX,X1
  989.     XCHG EDX,X2
  990.     MOV X1,EDX
  991.     MOV EDX,C1
  992.     XCHG EDX,C2
  993.     MOV C1,EDX
  994.     
  995.   FTriG8B_Sort3: 
  996.     
  997.     MOV Y1,EAX
  998.     MOV Y2,EBX
  999.     MOV Y3,ECX
  1000.     
  1001.     ; ##### IF Y1<>Y2 THEN M12 =(X2-X1)/(Y2-Y1)*2^16
  1002.     ; #####                MC12=(C2-C1)/(Y2-Y1)*2^16
  1003.     SUB EBX,EAX
  1004.     JZ FTriG8B_CalcM13
  1005.     MOV EAX,X2
  1006.     SUB EAX,X1
  1007.     SHL EAX,16
  1008.     CDQ
  1009.     IDIV EBX
  1010.     MOV M12,EAX
  1011.     MOV EAX,C2
  1012.     SUB EAX,C1
  1013.     SHL EAX,16
  1014.     CDQ
  1015.     IDIV EBX
  1016.     MOV MC12,EAX
  1017.     
  1018.   FTriG8B_CalcM13:
  1019.   
  1020.     ; ##### IF Y1<>Y3 THEN M13 =(X3-X1)/(Y3-Y1)*2^16
  1021.     ; #####                MC13=(C3-C1)/(Y3-Y1)*2^16
  1022.     MOV EBX,Y3
  1023.     SUB EBX,Y1
  1024.     JZ FTriG8B_CalcM23
  1025.     MOV EAX,X3
  1026.     SUB EAX,X1
  1027.     SHL EAX,16
  1028.     CDQ
  1029.     IDIV EBX
  1030.     MOV M13,EAX
  1031.     MOV EAX,C3
  1032.     SUB EAX,C1
  1033.     SHL EAX,16
  1034.     CDQ
  1035.     IDIV EBX
  1036.     MOV MC13,EAX
  1037.     
  1038.   FTriG8B_CalcM23:
  1039.   
  1040.     ; ##### IF Y2<>Y3 THEN M23 =(X3-X2)/(Y3-Y2)*2^16
  1041.     ; #####                MC23=(C3-C2)/(Y3-Y2)*2^16
  1042.     MOV EBX,Y3
  1043.     SUB EBX,Y2
  1044.     JZ FTriG8B_Draw
  1045.     MOV EAX,X3
  1046.     SUB EAX,X2
  1047.     SHL EAX,16
  1048.     CDQ
  1049.     IDIV EBX
  1050.     MOV M23,EAX
  1051.     MOV EAX,C3
  1052.     SUB EAX,C2
  1053.     SHL EAX,16
  1054.     CDQ
  1055.     IDIV EBX
  1056.     MOV MC23,EAX
  1057.  
  1058.   FTriG8B_Draw:
  1059.  
  1060.     ; ##### Two loops follow, in wich (XA,Y) and (XB,Y) walk along the
  1061.     ; ##### borders of the triangle.
  1062.     ; ##### As a bonus, Colors (CA and CB) are interpolated between the
  1063.     ; ##### edges.
  1064.     ; ##### In the first, Y walks from Y1 to Y2, XA walks from X1 to X2
  1065.     ; ##### and XB starts to walk from X1 to X3.
  1066.     ; ##### In the second loop, Y continues to Y3, XA walks from X2 to X3
  1067.     ; ##### and XB continues his journey to X3.
  1068.     
  1069.     ; ##### Initialize Y.
  1070.     MOV EAX,Y1
  1071.     MOV Y,EAX
  1072.     
  1073.     ; ##### Initialize XA and XB.
  1074.     MOV EAX,X1
  1075.     SHL EAX,16
  1076.     MOV XA,EAX
  1077.     MOV XB,EAX
  1078.     
  1079.     ; ##### Initialize CA and CB.
  1080.     MOV EAX,C1
  1081.     SHL EAX,16
  1082.     MOV CA,EAX
  1083.     MOV CB,EAX
  1084.     
  1085.   FTriG8B_Loop1:
  1086.     
  1087.     ; ##### Ready with first loop?
  1088.     MOV EAX,Y
  1089.     CMP EAX,Y2
  1090.     JE FTriG8B_Loop2Init
  1091.     
  1092.     ; ##### Call HLineG8B.
  1093.     MOV EAX,XA
  1094.     SAR EAX,16
  1095.     PUSH EAX
  1096.     MOV EAX,XB
  1097.     SAR EAX,16
  1098.     PUSH EAX
  1099.     MOV EAX,Y
  1100.     PUSH EAX
  1101.     MOV EAX,CA
  1102.     PUSH EAX
  1103.     MOV EAX,CB
  1104.     PUSH EAX
  1105.     MOVZX EAX,S
  1106.     PUSH EAX
  1107.     CALL VESA_HLineG8B
  1108.  
  1109.     ; ##### Calculate new X- and Color-Values.
  1110.     MOV EAX,M12
  1111.     ADD XA,EAX
  1112.     MOV EAX,M13
  1113.     ADD XB,EAX
  1114.     MOV EAX,MC12
  1115.     ADD CA,EAX
  1116.     MOV EAX,MC13
  1117.     ADD CB,EAX
  1118.     
  1119.     INC Y
  1120.     
  1121.     JMP FTriG8B_Loop1
  1122.     
  1123.   FTriG8B_Loop2Init:
  1124.   
  1125.     MOV EAX,C2
  1126.     SHL EAX,16
  1127.     MOV CA,EAX
  1128.     MOV EAX,X2
  1129.     SHL EAX,16
  1130.     MOV XA,EAX
  1131.   
  1132.   FTriG8B_Loop2:
  1133.     
  1134.     ; ##### Ready ?
  1135.     MOV EAX,Y
  1136.     CMP EAX,Y3
  1137.     JG FTriG8B_Exit
  1138.     
  1139.     ; ##### Call HLineG8B.
  1140.     MOV EAX,XA
  1141.     SAR EAX,16
  1142.     PUSH EAX
  1143.     MOV EAX,XB
  1144.     SAR EAX,16
  1145.     PUSH EAX
  1146.     MOV EAX,Y
  1147.     PUSH EAX
  1148.     MOV EAX,CA
  1149.     PUSH EAX
  1150.     MOV EAX,CB
  1151.     PUSH EAX
  1152.     MOVZX EAX,S
  1153.     PUSH EAX
  1154.     CALL VESA_HLineG8B
  1155.  
  1156.     ; ##### Calculate new X- and Color-Values.
  1157.     MOV EAX,M23
  1158.     ADD XA,EAX
  1159.     MOV EAX,M13
  1160.     ADD XB,EAX
  1161.     MOV EAX,MC23
  1162.     ADD CA,EAX
  1163.     MOV EAX,MC13
  1164.     ADD CB,EAX
  1165.     
  1166.     INC Y
  1167.     
  1168.     JMP FTriG8B_Loop2
  1169.  
  1170.   FTriG8B_Exit:  
  1171.  
  1172.     RET                        
  1173.  
  1174. VESA_FilledTriangleG8B ENDP   
  1175.    
  1176. VESA_HLineTex8B PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,TX1:DWORD,TY1:DWORD,TX2:DWORD,TY2:DWORD,
  1177.                             MulTable:DWORD,S:WORD
  1178.             
  1179.     ; ##### Draws a textured HLine from (X1,Y) to (X2,Y). Texture coordinates
  1180.     ; ##### are interpolated from (TX1,TY1) to (TX2,TY2). S is the Screen
  1181.     ; ##### Selector, MulTable is a pointer to a DWORD-array, in which every 
  1182.     ; ##### DWORD is the Memory-Offset for the corresponding line. 
  1183.             
  1184.     LOCAL StartTX:DWORD
  1185.            
  1186.     MOV FS,CS:CodeAlias           
  1187.      
  1188.     ; ##### Clipping...      
  1189.     MOV EDX,X1
  1190.     MOV EBX,X2
  1191.     MOV ECX,Y
  1192.     
  1193.     CMP ECX,VESAMinY
  1194.     JL HLiT8B_Exit
  1195.     
  1196.     CMP ECX,VESAMaxY
  1197.     JG HLiT8B_Exit
  1198.     
  1199.     CMP EDX,EBX
  1200.     JLE HLiT8B_XOk
  1201.     ; ##### Swaping...
  1202.     XCHG EDX,EBX    
  1203.     MOV X1,EDX
  1204.     MOV X2,EBX
  1205.     MOV EAX,TX1
  1206.     XCHG EAX,TX2
  1207.     MOV TX1,EAX
  1208.     MOV EAX,TY1
  1209.     XCHG EAX,TY2
  1210.     MOV TY1,EAX
  1211.     
  1212.   HLiT8B_XOk:         
  1213.  
  1214.     CMP EDX,VESAMaxX
  1215.     JG HLiT8B_Exit
  1216.     
  1217.     CMP EBX,VESAMinX
  1218.     JL HLiT8B_Exit
  1219.     
  1220.     ; ##### Prepare to correct the start-tex-coors if clipping is necessary.
  1221.     MOV StartTX,0
  1222.     CMP EDX,VESAMinX
  1223.     JGE HLiT8B_X1OK
  1224.     SUB EDX,VESAMinX
  1225.     NEG EDX
  1226.     MOV StartTX,EDX
  1227.     MOV EDX,VESAMinX
  1228.     
  1229.   HLiT8B_X1OK:  
  1230.   
  1231.     CMP EBX,VESAMaxX
  1232.     JLE HLiT8B_X2OK
  1233.     MOV EBX,VESAMaxX
  1234.     
  1235.   HLiT8B_X2OK:  
  1236.  
  1237.     ; ##### Get screen offset.
  1238.     MOV ES,S
  1239.     MOV EDI,VESAOffs[ECX*4]
  1240.     ADD EDI,EDX
  1241.     
  1242.     ; #### ECX = Number of pixs.
  1243.     SUB EBX,EDX
  1244.     MOV ECX,EBX
  1245.     INC ECX
  1246.     
  1247.     MOV EBX,X2
  1248.     SUB EBX,X1
  1249.     JZ HLiT8B_InitLoop
  1250.     
  1251.     ; ##### Calc dTX/dX.
  1252.     MOV EAX,TX2
  1253.     SUB EAX,TX1
  1254.     CDQ
  1255.     IDIV EBX
  1256.     MOV FS:HLiT8B_ADDTX,EAX
  1257.     ; ##### Correct start-TX if clipping was necessary.
  1258.     IMUL StartTX
  1259.     ADD TX1,EAX
  1260.     
  1261.     ; ##### Calc dTY/dX.
  1262.     MOV EAX,TY2
  1263.     SUB EAX,TY1
  1264.     CDQ
  1265.     IDIV EBX           
  1266.     MOV FS:HLiT8B_ADDTY,EAX
  1267.     ; ##### Correct start-TY if clipping was necessary.
  1268.     IMUL StartTX
  1269.     ADD TY1,EAX
  1270.     
  1271.   HLiT8B_InitLoop:   
  1272.  
  1273.     ; ##### Prepare to LOOP.
  1274.     MOV EBX,MulTable
  1275.     MOV HLiT8B_MULTable,EBX
  1276.     MOV EDX,TX1
  1277.     MOV EBX,TY1
  1278.     CLD
  1279.     
  1280.     ; ##### Main LOOP :
  1281.     ; ##### EDX = TX in 16.16 fixed points.
  1282.     ; ##### EBX = TY in 16.16 fixed points.
  1283.     
  1284.   HLiT8B_Loop:
  1285.  
  1286.     ; ESI = TX + MulTable[TY];
  1287.     MOV EAX,EBX
  1288.     SHR EAX,16
  1289.     
  1290.     MOV ESI,EDX
  1291.     SHR ESI,16
  1292.     ; ##### ADD ESI,MULTable[4*EAX]
  1293.     db 003h,034h,085h
  1294.     HLiT8B_MULTable DD ?
  1295.  
  1296.     MOVSB
  1297.     
  1298.     ; ##### ADD EDX,_ADDTX
  1299.     DB 081h, 0c2h
  1300.     HLiT8B_ADDTX DD ?
  1301.     
  1302.     ; ##### ADD EBX,_ADDTY
  1303.     DB 081h, 0c3h
  1304.     HLiT8B_ADDTY DD ?
  1305.     
  1306.     LOOP HLiT8B_Loop
  1307.  
  1308.   HLiT8B_Exit:
  1309.  
  1310.     RET
  1311.   
  1312. VESA_HLineTex8B ENDP   
  1313.  
  1314. VESA_ClearZBuffer PROC PASCAL M:DWORD,C:DWORD
  1315.  
  1316.     ; ##### Clears the entire Z-Buffer pointed to by M.
  1317.     ; ##### C is the number of z-values in M.
  1318.  
  1319.     PUSH DS
  1320.     POP ES
  1321.     MOV EDI,M
  1322.     MOV ECX,C
  1323.     ; ##### 0ffffffffh is VERY far away.
  1324.     MOV EAX,0ffffffffh
  1325.     CLD
  1326.     REP STOSD
  1327.     RET
  1328.  
  1329. VESA_ClearZBuffer ENDP
  1330.    
  1331. VESA_HLineZ8B PROC PASCAL X1:DWORD, X2:DWORD, Y:DWORD, Z1:DWORD, Z2:DWORD, C:DWORD, 
  1332.                           ZSEL:WORD, S:WORD
  1333.  
  1334.     ; ##### Draws a zbuffered-HLine from (X1,Y(,Z1)) to (X2,Y(,Z2)) with Color C
  1335.     ; ##### in all 256-color-modes. ZSEL is the z-buffer-Selector, S the 
  1336.     ; ##### screen-selector.
  1337.  
  1338.     LOCAL Correction:DWORD
  1339.  
  1340.     MOV FS,CS:CodeAlias
  1341.  
  1342.     ; ##### Clipping...
  1343.     MOV EAX,X1
  1344.     MOV EBX,X2
  1345.     MOV ECX,Y
  1346.     
  1347.     CMP ECX,VESAMinY
  1348.     JL HLiZ8B_Exit
  1349.     
  1350.     CMP ECX,VESAMaxY
  1351.     JG HLiZ8B_Exit
  1352.     
  1353.     CMP EAX,EBX
  1354.     JLE HLiZ8B_XOk
  1355.     ; ##### Swaping...
  1356.     XCHG EAX,EBX    
  1357.     MOV X1,EAX
  1358.     MOV X2,EBX
  1359.     MOV EDX,Z1
  1360.     XCHG EDX,Z2
  1361.     MOV Z1,EDX
  1362.     
  1363.   HLiZ8B_XOk:         
  1364.  
  1365.     CMP EAX,VESAMaxX
  1366.     JG HLiZ8B_Exit
  1367.     
  1368.     CMP EBX,VESAMinX
  1369.     JL HLiZ8B_Exit
  1370.     
  1371.     ; ##### Prepare to correct start-Z-value if clipping is necessary.
  1372.     MOV Correction,0
  1373.     CMP EAX,VESAMinX
  1374.     JGE HLiZ8B_X1OK
  1375.     SUB EAX,VESAMinX
  1376.     NEG EAX
  1377.     MOV Correction,EAX
  1378.     MOV EAX,VESAMinX
  1379.     
  1380.   HLiZ8B_X1OK:  
  1381.   
  1382.     CMP EBX,VESAMaxX
  1383.     JLE HLiZ8B_X2OK
  1384.     MOV EBX,VESAMaxX
  1385.     
  1386.   HLiZ8B_X2OK:  
  1387.  
  1388.     ; ##### Get screen offset and z-buffer-selector.
  1389.     MOV ES,S
  1390.     MOV EDI,VESAOffs[ECX*4]
  1391.     ADD EDI,EAX
  1392.     MOV GS,ZSEL
  1393.     
  1394.     ; ##### ECX = nr. of pixs.
  1395.     SUB EBX,EAX
  1396.     MOV ECX,EBX
  1397.     INC ECX
  1398.     
  1399.     MOV EBX,X2
  1400.     SUB EBX,X1
  1401.     JZ HLiZ8B_DXZero
  1402.  
  1403.     ; ##### Calc dZ/dX.    
  1404.     MOV EAX,Z2
  1405.     SUB EAX,Z1
  1406.     CDQ
  1407.     IDIV EBX
  1408.     MOV FS:HLiZ8B_ADDZ,EAX    
  1409.     
  1410.   HLiZ8B_DXZero:
  1411.  
  1412.     ; ##### Correct start-Z-value if clipping was necessary.
  1413.     IMUL EAX,Correction   
  1414.     MOV EDX,Z1
  1415.     ADD EDX,EAX
  1416.     MOV EAX,C
  1417.     
  1418.     ; ##### Main LOOP:
  1419.     ; ##### EDX = Z in 16.16 fixed point or 8.24 or whatever you like... ;)
  1420.     ; ##### EDI = Offset to pixel in screen.
  1421.     ; ##### EDI*4 = Offset to value in Z-Buffer.
  1422.     
  1423.   HLiZ8B_Loop:
  1424.  
  1425.     ; ##### Compare Z with value in z-buffer.
  1426.     ; ##### If behind, don't pix.
  1427.     CMP EDX,GS:[EDI*4]
  1428.     JAE HLiZ8B_Behind
  1429.     ; ##### If before, set new z-buffer-value and pix.
  1430.     MOV GS:[EDI*4],EDX
  1431.     MOV ES:[EDI],AL
  1432.     
  1433.   HLiZ8B_Behind:
  1434.   
  1435.     db 081h, 0c2h
  1436.     HLiZ8B_ADDZ dd ?
  1437.  
  1438.     INC EDI    
  1439.   
  1440.     LOOP HLiZ8B_Loop
  1441.   
  1442.   HLiZ8B_Exit:
  1443.   
  1444.     RET  
  1445.  
  1446. VESA_HLineZ8B ENDP   
  1447.    
  1448. VESA_HLineGZ8B PROC PASCAL X1:DWORD, X2:DWORD, Y:DWORD, Z1:DWORD, Z2:DWORD, C1:DWORD, 
  1449.                            C2:DWORD, ZSEL:WORD, S:WORD
  1450.  
  1451.     ; ##### Draws a zbuffered/gouraudshaded HLine from (X1,Y(,Z1)) to (X2,Y(,Z2)) 
  1452.     ; ##### with colors interpolated from C1 to C2
  1453.     ; ##### in all 256-color-modes. ZSEL is the z-buffer-Selector, S the 
  1454.     ; ##### screen-selector.
  1455.  
  1456.     LOCAL Correction:DWORD
  1457.  
  1458.     MOV FS,CS:CodeAlias
  1459.  
  1460.     ; ##### Clipping...
  1461.     MOV EAX,X1
  1462.     MOV EBX,X2
  1463.     MOV ECX,Y
  1464.     
  1465.     CMP ECX,VESAMinY
  1466.     JL HLiGZ8B_Exit
  1467.     
  1468.     CMP ECX,VESAMaxY
  1469.     JG HLiGZ8B_Exit
  1470.     
  1471.     CMP EAX,EBX
  1472.     JLE HLiGZ8B_XOk
  1473.     ; ##### Swaping...
  1474.     XCHG EAX,EBX    
  1475.     MOV X1,EAX
  1476.     MOV X2,EBX
  1477.     MOV EDX,Z1
  1478.     XCHG EDX,Z2
  1479.     MOV Z1,EDX
  1480.     MOV EDX,C1
  1481.     XCHG EDX,C2
  1482.     MOV C1,EDX
  1483.     
  1484.   HLiGZ8B_XOk:         
  1485.  
  1486.     CMP EAX,VESAMaxX
  1487.     JG HLiGZ8B_Exit
  1488.     
  1489.     CMP EBX,VESAMinX
  1490.     JL HLiGZ8B_Exit
  1491.     
  1492.     ; ##### Prepare to correct start-Z-value if clipping is necessary.
  1493.     MOV Correction,0
  1494.     CMP EAX,VESAMinX
  1495.     JGE HLiGZ8B_X1OK
  1496.     SUB EAX,VESAMinX
  1497.     NEG EAX
  1498.     MOV Correction,EAX
  1499.     MOV EAX,VESAMinX
  1500.     
  1501.   HLiGZ8B_X1OK:  
  1502.   
  1503.     CMP EBX,VESAMaxX
  1504.     JLE HLiGZ8B_X2OK
  1505.     MOV EBX,VESAMaxX
  1506.     
  1507.   HLiGZ8B_X2OK:  
  1508.  
  1509.     ; ##### Get screen offset and z-buffer-selector.
  1510.     MOV ES,S
  1511.     MOV EDI,VESAOffs[ECX*4]
  1512.     ADD EDI,EAX
  1513.     MOV GS,ZSEL
  1514.     
  1515.     ; ##### ECX = nr. of pixs.
  1516.     SUB EBX,EAX
  1517.     MOV ECX,EBX
  1518.     INC ECX
  1519.     
  1520.     MOV EBX,X2
  1521.     SUB EBX,X1
  1522.     JZ HLiGZ8B_DXZero
  1523.  
  1524.     ; ##### Calc dZ/dX.    
  1525.     MOV EAX,Z2
  1526.     SUB EAX,Z1
  1527.     CDQ
  1528.     IDIV EBX
  1529.     MOV FS:HLiGZ8B_ADDZ,EAX    
  1530.     IMUL EAX,Correction
  1531.     ADD Z1,EAX
  1532.     
  1533.     MOV EAX,C2
  1534.     SUB EAX,C1
  1535.     CDQ
  1536.     IDIV EBX
  1537.     MOV FS:HLiGZ8B_ADDC,EAX
  1538.     IMUL EAX,Correction
  1539.     ADD C1,EAX
  1540.     
  1541.   HLiGZ8B_DXZero:
  1542.  
  1543.     ; ##### Correct start-Z-value if clipping was necessary.
  1544.     MOV EDX,Z1
  1545.     MOV EAX,C1
  1546.     
  1547.     ; ##### Main LOOP:
  1548.     ; ##### EDX = Z in 16.16 fixed point or 8.24 or whatever you like... ;)
  1549.     ; ##### EDI = Offset to pixel in screen.
  1550.     ; ##### EDI*4 = Offset to value in Z-Buffer.
  1551.     
  1552.   HLiGZ8B_Loop:
  1553.  
  1554.     ; ##### Compare Z with value in z-buffer.
  1555.     ; ##### If behind, don't pix.
  1556.     CMP EDX,GS:[EDI*4]
  1557.     JAE HLiGZ8B_Behind
  1558.     ; ##### If before, set new z-buffer-value and pix.
  1559.     MOV GS:[EDI*4],EDX
  1560.     BSWAP EAX
  1561.     MOV ES:[EDI],AH
  1562.     BSWAP EAX
  1563.     
  1564.   HLiGZ8B_Behind:
  1565.   
  1566.     ; ##### Get next Z- and C-Value.    
  1567.     ; ##### ADD EDX,_ADDZ
  1568.     db 081h, 0c2h
  1569.     HLiGZ8B_ADDZ dd ?
  1570.     
  1571.     ; ##### ADD EAX,_ADDC
  1572.     db 05h
  1573.     HLiGZ8B_ADDC dd ?
  1574.  
  1575.     INC EDI    
  1576.   
  1577.     LOOP HLiGZ8B_Loop
  1578.   
  1579.   HLiGZ8B_Exit:
  1580.   
  1581.     RET  
  1582.  
  1583. VESA_HLineGZ8B ENDP   
  1584.    
  1585. VESA_HLineTexZ8B PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,TX1:DWORD,TY1:DWORD,TX2:DWORD,TY2:DWORD,
  1586.                              Z1:DWORD,Z2:DWORD,MulTable:DWORD,ZSEL:WORD,S:WORD
  1587.             
  1588.     ; ##### Draws a textured HLine from (X1,Y) to (X2,Y). Texture coordinates
  1589.     ; ##### are interpolated from (TX1,TY1) to (TX2,TY2). S is the Screen
  1590.     ; ##### Selector, MulTable is a pointer to a DWORD-array, in which every 
  1591.     ; ##### DWORD is the Memory-Offset for the corresponding line.
  1592.     ; ##### ZSEL is the Z-Buffer-Selector.
  1593.     ; #####
  1594.     ; ##### The TX- and Z-Values must all be 16.16-Fixed-Points.
  1595.             
  1596.     LOCAL StartTX:DWORD
  1597.            
  1598.     MOV FS,CS:CodeAlias           
  1599.      
  1600.     ; ##### Clipping...      
  1601.     MOV EDX,X1
  1602.     MOV EBX,X2
  1603.     MOV ECX,Y
  1604.     
  1605.     CMP ECX,VESAMinY
  1606.     JL HLiTZ8B_Exit
  1607.     
  1608.     CMP ECX,VESAMaxY
  1609.     JG HLiTZ8B_Exit
  1610.     
  1611.     CMP EDX,EBX
  1612.     JLE HLiTZ8B_XOk
  1613.     ; ##### Swaping...
  1614.     XCHG EDX,EBX    
  1615.     MOV X1,EDX
  1616.     MOV X2,EBX
  1617.     MOV EAX,TX1
  1618.     XCHG EAX,TX2
  1619.     MOV TX1,EAX
  1620.     MOV EAX,TY1
  1621.     XCHG EAX,TY2
  1622.     MOV TY1,EAX
  1623.     MOV EAX,Z1
  1624.     XCHG EAX,Z2
  1625.     MOV Z1,EAX
  1626.     
  1627.   HLiTZ8B_XOk:         
  1628.  
  1629.     CMP EDX,VESAMaxX
  1630.     JG HLiTZ8B_Exit
  1631.     
  1632.     CMP EBX,VESAMinX
  1633.     JL HLiTZ8B_Exit
  1634.     
  1635.     ; ##### Prepare to correct the start-values if clipping is necessary.
  1636.     MOV StartTX,0
  1637.     CMP EDX,VESAMinX
  1638.     JGE HLiTZ8B_X1OK
  1639.     SUB EDX,VESAMinX
  1640.     NEG EDX
  1641.     MOV StartTX,EDX
  1642.     MOV EDX,VESAMinX
  1643.     
  1644.   HLiTZ8B_X1OK:  
  1645.   
  1646.     CMP EBX,VESAMaxX
  1647.     JLE HLiTZ8B_X2OK
  1648.     MOV EBX,VESAMaxX
  1649.     
  1650.   HLiTZ8B_X2OK:  
  1651.  
  1652.     ; ##### Get screen offset.
  1653.     MOV ES,S
  1654.     MOV EDI,VESAOffs[ECX*4]
  1655.     ADD EDI,EDX
  1656.     MOV GS,ZSEL
  1657.     
  1658.     ; #### ECX = Number of pixs.
  1659.     SUB EBX,EDX
  1660.     MOV ECX,EBX
  1661.     INC ECX
  1662.     
  1663.     MOV EBX,X2
  1664.     SUB EBX,X1
  1665.     JZ HLiTZ8B_InitLoop
  1666.     
  1667.     ; ##### Calc dTX/dX.
  1668.     MOV EAX,TX2
  1669.     SUB EAX,TX1
  1670.     CDQ
  1671.     IDIV EBX
  1672.     MOV FS:HLiTZ8B_ADDTX,EAX
  1673.     ; ##### Correct start-TX if clipping was necessary.
  1674.     IMUL StartTX
  1675.     ADD TX1,EAX
  1676.     
  1677.     ; ##### Calc dTY/dX.
  1678.     MOV EAX,TY2
  1679.     SUB EAX,TY1
  1680.     CDQ
  1681.     IDIV EBX           
  1682.     MOV FS:HLiTZ8B_ADDTY,EAX
  1683.     ; ##### Correct start-TY if clipping was necessary.
  1684.     IMUL StartTX
  1685.     ADD TY1,EAX
  1686.     
  1687.     ; ##### Calc dZ/dX.
  1688.     MOV EAX,Z2
  1689.     SUB EAX,Z1
  1690.     CDQ
  1691.     IDIV EBX
  1692.     MOV FS:HLiTZ8B_ADDZ,EAX
  1693.     ; ##### Correct start-Z if clipping was necessary.
  1694.     IMUL StartTX
  1695.     ADD Z1,EAX
  1696.     
  1697.   HLiTZ8B_InitLoop:   
  1698.  
  1699.     ; ##### Prepare to LOOP.
  1700.     MOV EAX,MulTable
  1701.     MOV FS:HLiTZ8B_MULTable,EAX
  1702.     MOV EBX,Z1
  1703.     MOV EDX,TX1
  1704.     PUSH EBP
  1705.     MOV EBP,TY1
  1706.     
  1707.     ; ##### Main LOOP :
  1708.     ; ##### EDX = TX in 16.16 fixed points.
  1709.     ; ##### EBP = TY in 16.16 fixed points.
  1710.    
  1711.   HLiTZ8B_Loop:
  1712.  
  1713.     CMP EBX,GS:[EDI*4]
  1714.     JAE HLiTZ8B_Behind
  1715.     MOV GS:[EDI*4],EBX
  1716.     ; ESI = TX + MulTable[TY];
  1717.     MOV EAX,EBP
  1718.     SAR EAX,16
  1719.     MOV ESI,EDX
  1720.     SAR ESI,16
  1721.     ; ##### ADD ESI,DWORD DS:[_MULTable+4*EAX]
  1722.     db 003h,034h,085h
  1723.     HLiTZ8B_MULTable DD ?
  1724.  
  1725.     MOV AL,DS:[ESI]
  1726.     MOV ES:[EDI],AL
  1727.     
  1728.   HLiTZ8B_Behind:  
  1729.     
  1730.     ; ##### ADD EDX,_ADDTX
  1731.     DB 081h, 0c2h
  1732.     HLiTZ8B_ADDTX DD ?
  1733.     
  1734.     ; ##### ADD EBP,_ADDTY
  1735.     DB 081h, 0c5h
  1736.     HLiTZ8B_ADDTY DD ?
  1737.     
  1738.     ; ##### ADD EBX,_ADDZ
  1739.     DB 081h,0c3h
  1740.     HLiTZ8B_ADDZ DD ?
  1741.     
  1742.     INC EDI
  1743.     
  1744.     LOOP HLiTZ8B_Loop
  1745.  
  1746.     POP EBP
  1747.  
  1748.   HLiTZ8B_Exit:
  1749.  
  1750.     RET
  1751.   
  1752. VESA_HLineTexZ8B ENDP   
  1753.  
  1754. VESA_HLineG8BFast PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,C1:DWORD,C2:DWORD,DC:DWORD,S:WORD
  1755.  
  1756.     MOV EAX,Y
  1757.     MOV EBX,X1
  1758.     MOV ECX,X2
  1759.     MOV EDX,C1
  1760.     CMP EBX,ECX
  1761.     JLE HLiG8BF_XOk
  1762.     XCHG EBX,ECX
  1763.     MOV EDX,C2
  1764.     
  1765.   HLiG8BF_XOk:  
  1766.  
  1767.     MOV ES,S
  1768.     MOV EDI,VESAOffs[EAX*4]
  1769.     ADD EDI,EBX
  1770.  
  1771.     SUB ECX,EBX
  1772.     INC ECX
  1773.  
  1774.     MOV EBX,DC
  1775.     CLD
  1776.     
  1777.   HLiG8BF_Loop:  
  1778.     
  1779.     MOV EAX,EDX
  1780.     SAR EAX,16
  1781.     
  1782.     STOS BYTE ES:[EDI]
  1783.     
  1784.     ADD EDX,EBX
  1785.     
  1786.     LOOP HLiG8BF_Loop
  1787.  
  1788.   HLiG8BF_Exit:
  1789.  
  1790.     RET
  1791.  
  1792. VESA_HLineG8BFast ENDP
  1793.  
  1794. VESA_HLineTex8BFast PROC PASCAL X1:DWORD,X2:DWORD,Y:DWORD,
  1795.                                 TX1:DWORD,TY1:DWORD,TX2:DWORD,TY2:DWORD,
  1796.                                 DTX:DWORD, DTY:DWORD,
  1797.                                 MUL:DWORD, S:WORD
  1798.  
  1799.     MOV FS,CS:CodeAlias
  1800.  
  1801.     MOV EAX,Y
  1802.     MOV EBX,X1
  1803.     MOV ECX,X2
  1804.     MOV EDX,TX1
  1805.     MOV ESI,TY1
  1806.     CMP EBX,ECX
  1807.     JLE HLiT8BF_XOk
  1808.     XCHG EBX,ECX
  1809.     MOV EDX,TX2
  1810.     MOV ESI,TY2
  1811.     
  1812.   HLiT8BF_XOk:  
  1813.  
  1814.     MOV ES,S
  1815.     MOV EDI,VESAOffs[EAX*4]
  1816.     ADD EDI,EBX
  1817.  
  1818.     SUB ECX,EBX
  1819.     INC ECX
  1820.     
  1821.     MOV EAX,MUL
  1822.     MOV FS:HLiT8BF_MULTable,EAX
  1823.     MOV EAX,DTX
  1824.     MOV FS:HLiT8BF_ADDTX,EAX
  1825.     MOV EAX,DTY
  1826.     MOV FS:HLiT8BF_ADDTY,EAX
  1827.  
  1828.     MOV EBX,ESI
  1829.     CLD
  1830.     
  1831.   HLiT8BF_Loop:  
  1832.     
  1833.     ; ESI = TX + MulTable[TY];
  1834.     MOV EAX,EBX
  1835.     SHR EAX,16
  1836.     MOV ESI,EDX
  1837.     SHR ESI,16
  1838.     ; ##### ADD ESI,_MulTable[4*EAX]
  1839.     db 003h,034h,085h
  1840.     HLiT8BF_MULTable DD ?
  1841.  
  1842.     MOVSB
  1843.     
  1844.     ; ##### ADD EDX,_ADDTX
  1845.     DB 081h, 0c2h
  1846.     HLiT8BF_ADDTX DD ?
  1847.     
  1848.     ; ##### ADD EBX,_ADDTY
  1849.     DB 081h, 0c3h
  1850.     HLiT8BF_ADDTY DD ?
  1851.     
  1852.     LOOP HLiT8BF_Loop
  1853.  
  1854.   HLiT8BF_Exit:
  1855.  
  1856.     RET
  1857.  
  1858. VESA_HLineTex8BFast ENDP
  1859.  
  1860. CODE ENDS   
  1861.    
  1862. END
  1863.  
  1864.